package br.com.sis.rh.action;

import java.util.ArrayList;
import java.util.List;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.sis.rh.entity.AreaAtuacao;
import br.com.sis.rh.entity.Candidato;
import br.com.sis.rh.enums.CamposAbasEnum;
import br.com.sis.rh.facade.AreaAtuacaoFacade;
import br.com.sis.rh.facade.CandidatoFacade;
import br.com.sis.rh.util.HistoricoProfissionalAux;
import br.com.sis.rh.vo.RetornoAjaxVO;

@Controller
@Scope("request")
@ParentPackage("json-default")
@Namespace(value = "/")
public class AreaAtuacaoAction extends ComumAuxAction implements ComumAction {

    @Autowired
    private EhCacheCacheManager ehCache;
	
	@Autowired
	private AreaAtuacaoFacade areaAtuacaoFacade;
	
	@Autowired
	private CandidatoFacade candidatoFacade;
	
	@Autowired
	private HistoricoProfissionalAux historicoProfissionalAux;		

	private Candidato candidato;
	
	private String areasAtuacao;
	
	private RetornoAjaxVO retornoAjax;
	
	@Override
	public String incluir() {
		return null;
	}

	@Override
	public String alterar() {
		return null;
	}

	@Override
	public String excluir() {
		return null;
	}

	@SuppressWarnings("unchecked")
	@Override
	@Action(value="listarAreaAtuacao", results={
			@Result(name="success", type="json", params={"root","retornoAjax"})
	})
	public String listar() {
		retornoAjax = new RetornoAjaxVO();
		
		List<AreaAtuacao> areaAtuacaoCache = new ArrayList<>();
		
		if(ehCache.getCache("areaAtuacao").get("1") != null) {
			areaAtuacaoCache = (ArrayList<AreaAtuacao>) ehCache.getCache("areaAtuacao").get("1").get();
		} else {
			areaAtuacaoCache = areaAtuacaoFacade.listar(new AreaAtuacao());
			ehCache.getCache("areaAtuacao").put("1", areaAtuacaoCache);
		}		
		
		retornoAjax.setObjetoRetornado(areaAtuacaoCache);
		
		return SUCCESS;
	}
	
	@Action(value="incluirAreasAtuacao", results={
			@Result(name="success", type="json", params={"root","retornoAjax"})
	})
	public String incluirAreaAtuacaoCandidato() {
		
		retornoAjax = new RetornoAjaxVO();
		
		montaAreasAtuacao();
		
		candidatoFacade.incluirAreasAtuacao(candidato);
		
		Candidato candidatoAreaAtuacao = candidatoFacade.recuperarObjetoPorID(candidato);
		
		candidatoAreaAtuacao.setPorcentagemPreenchidaHistorico(calculaPorcentagemPreenchida(CamposAbasEnum.TOTAL_CAMPOS_HISTORICO.getQuantidadeCampos(), historicoProfissionalAux.atributosPreenchidos(candidatoAreaAtuacao)));
		
		retornoAjax.setObjetoRetornado(candidatoAreaAtuacao);
		retornoAjax.setStatusOperacao(SUCCESS);
		
		return SUCCESS;
	}
	
	private void montaAreasAtuacao() {
		String [] areasAtuacaoSplit = areasAtuacao.split(",");
		
		for(String areaAtuacaoId : areasAtuacaoSplit) {
			AreaAtuacao areaAtuacao = new AreaAtuacao();
			areaAtuacao.setId(Integer.valueOf(areaAtuacaoId));
			candidato.getAreaAtuacao().add(areaAtuacao);
		}
	}

	public AreaAtuacaoFacade getAreaAtuacaoFacade() {
		return areaAtuacaoFacade;
	}

	public void setAreaAtuacaoFacade(AreaAtuacaoFacade areaAtuacaoFacade) {
		this.areaAtuacaoFacade = areaAtuacaoFacade;
	}

	public RetornoAjaxVO getRetornoAjax() {
		return retornoAjax;
	}

	public void setRetornoAjax(RetornoAjaxVO retornoAjax) {
		this.retornoAjax = retornoAjax;
	}

	public Candidato getCandidato() {
		return candidato;
	}

	public void setCandidato(Candidato candidato) {
		this.candidato = candidato;
	}

	public String getAreasAtuacao() {
		return areasAtuacao;
	}

	public void setAreasAtuacao(String areasAtuacao) {
		this.areasAtuacao = areasAtuacao;
	}
}
